// class Person {
//     constructor(){
//     // 添加到 this 的所有内容都会存在于不同的实例上
//     this.locate = ()=>console.log('instance');
//     }
//      // 在类块中定义的所有内容都会定义在类的原型上
//      locate(){
//          console.log('prototype');
//      }
// }

// let p1 = new Person();
// let p2 = new Person();
// p1.locate();//instance
// p2.locate();
// p1.__proto__.locate();//prototype
// p2.__proto__.locate();//prototype
// console.log(p1.__proto__ === Person.prototype);//true

// class Person { 
//     name = 'Jack'
//    } 
// let person1 = new Person();
// let person2 = new Person();
// console.log(person1);//Person { name: 'Jack' }
// console.log(person2);//Person { name: 'Jack' }
// console.log(person1.__proto__.name);//undefined

// const symbolKey = Symbol('symbolKey');
// class Person {
//     stringKey(){
//         console.log('invoked stringKey');
//     }
//     [symbolKey](){
//         console.log('invoked symbolKey');
//     }
//     ['computed'+'Key'](){
//         console.log('invoked computedKey');
//     }
// }
// let p = new Person();
// p.stringKey();
// p[symbolKey]();
// p.computedKey();
// // invoked stringKey
// // invoked symbolKey
// // invoked computedKey

// class Person {
//     set name(newName){
//         console.log('----set name',newName);
//         this.name_ = newName;
//     }
//     get name(){
//         console.log('----get name',this.name_);
//         return this.name_;
//     }
// }
// let p = new Person();
// p.name = 'Jack';
// console.log(p.name);
// ----set name Jack
// ----get name Jack
// Jack


// class Person {
//     constructor(age){
//         // 添加到 this 的所有内容都会存在于不同的实例上
//         this.locate = () => console.log('instance',this);
//         this.age = age;
//     }
//     //定义在类的原型对象上
//     locate() { 
//         console.log('prototype', this); 
//         }
//     //定义在类本身上
//     static locate(){
//         console.log('class',this);
//     }
//     static username = 'zw'
//     //静态类方法非常适合作为实例工厂
//     static createPerson(){
//         //使用随机年龄创建并返回一个Person实例
//         return new Person(Math.floor(Math.random()*100));
//     }
// }
// let person = new Person()
// person.locate();
// Person.prototype.locate();
// Person.locate();
// console.log(Person.username);
// console.log(Person.createPerson());
// instance Person { locate: [Function], age: undefined }
// prototype Person {}
// class [Function: Person] { username: 'zw' }
// zw
// Person { locate: [Function], age: 67 }

// class Person {
//     //在原型上定义生成器方法
//     *createNicknameIterator(){
//         yield 'Jack';
//         yield 'Jake';
//         yield 'J-Dog';
//     }
//     //在类上定义生成器方法
//     static *createJobIterator(){
//         yield 'Butcher';
//         yield 'Baker';
//         yield 'Candlestick maker'
//     }
// }

// let jobTter = Person.createJobIterator();
// console.log(jobTter.next());
// console.log(jobTter.next());
// console.log(jobTter.next());
// console.log(jobTter.next());
// { value: 'Butcher', done: false }
// { value: 'Baker', done: false }
// { value: 'Candlestick maker', done: false }
// { value: undefined, done: true }
// let p = new Person();
// let nicknameIter = p.createNicknameIterator();
// console.log(nicknameIter.next());
// console.log(nicknameIter.next());
// console.log(nicknameIter.next());
// console.log(nicknameIter.next());
// { value: 'Jack', done: false }
// { value: 'Jake', done: false }
// { value: 'J-Dog', done: false }
// { value: undefined, done: true }


// class Person {
//     constructor(){
//         this.nicknames = ['Jack','Jake','J-Dog'];
//     }
//     *[Symbol.iterator](){
//         yield * this.nicknames.entries();
//     }
// }
// let person = new Person();
// for(let [index,nickname] of person){
//     console.log(index,nickname);
// }
// 0 Jack
// 1 Jake 
// 2 J-Dog
// class Person {
//     constructor(name){
//         this.name = name;
//     }
//     sayName(){
//         console.log(this.name)
//     }
// }
// let p = new Person('silly');
// console.log(p.sayName === Person.prototype.sayName);//true

//类定义中设置和获取访问器
// class Person {
//     set name(newName){
//         console.log('---------set name:'+newName);
//         this.name_ = newName;
//     }
//     get name(){
//         console.log('--------get name:'+this.name_);
//         return this.name_;
//     }
// }
// let person = new Person();
// person.name = 'smith';
// console.log(person.name);
// ---------set name:smith
// --------get name:smith
// smith

//与实例成员类似，静态成员在每一个类中只能存在一个
// class Person{
//     static name = 'smith'
//     static age = 18
//     static age = '45'
//     static show(){
//       console.log('-------Person static'+this);
//     }
// }
// console.log(Person.name);//smith
// console.log(Person.age);//45
// Person.show();
// -------Person staticclass Person{
//   static name = 'smith'
//   static age = 18
//   static age = '45'
//   static show(){
//     console.log('-------Person static'+this);
//   }
// }
// 非函数原型和类原型
// class Person {};
// Person.greet = 'hello';
// Person.prototype.name = 'world';
// let person = new Person();
// console.log(person.greet);//undefined
// console.log(person.name);//world
// console.log(Person.name);//Person

// class Person {
//   * createIterator(){
//     yield 'Smith';
//     yield 'Alice';
//     yield 'John';
//   }
//   static * createIterator(){
//     yield 'Math';
//     yield 'EngLish';
//     yield 'Art'
//   }
// }
// let iterator1 = Person.createIterator();
// console.log(iterator1.next());
// console.log(iterator1.next());
// console.log(iterator1.next());
// console.log(iterator1.next());
// { value: 'Math', done: false }
// { value: 'EngLish', done: false }
// { value: 'Art', done: false }
// { value: undefined, done: true }
// let person = new Person();
// let iterator2 = person.createIterator();
// console.log(iterator2.next());
// console.log(iterator2.next());
// console.log(iterator2.next());
// console.log(iterator2.next());
// { value: 'Smith', done: false }
// { value: 'Alice', done: false }
// { value: 'John', done: false }
// { value: undefined, done: true }

// 迭代器与生成器方法
// var fruits = ["Banana", "Orange", "Apple", "Mango"];
// console.log(JSON.stringify(fruits.entries()).toString());
// console.log(fruits[0]);//Banana
// console.log(fruits[1]);//Orange
// console.log(fruits[2]);//Apple

class Person {
  constructor(){
    this.name = ['alice','smith','john','alan']
  }
  *[Symbol.iterator](){
    yield * this.name.entries();
  }
}
for(let [index,value] of new Person()){
  console.log( index +'----------'+ value );
}
// 0----------alice
// 1----------smith
// 2----------john
// 3----------alan